package com.zb.kl.util;

import cn.hutool.core.date.DateTime;
import org.apache.commons.lang3.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
 * 时间工具类
 */
public class DateUtil {

    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    /**
     * 大写日期转换
     * eg. 2022-04-24  -->  二零二二年四月二十四日
     * @param date
     * @return
     */
    public static String dateToUpper(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1;
        return numToUpper(year) + "年" + monthToUpper(month) + "月";
    }

    public static String dateToUpperAll(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1;
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        return numToUpper(year) + "年" + monthToUpper(month) + "月" + dayToUpper(day) + "日";
    }

    private static String numToUpper(int num) {
        String[] u = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
        char[] str = String.valueOf(num).toCharArray();
        StringBuilder result = new StringBuilder();
        for (char c : str) {
            result.append(u[Integer.parseInt(c + "")]);
        }
        return result.toString();
    }

    public static String formatLocalTime(LocalTime time) {
        if (time == null) {
            return "00:00";
        }
        // 创建自定义的时间格式化器
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");

        // 格式化 LocalTime 对象为指定格式的字符串
        return time.format(formatter);
    }



    private static String monthToUpper(int month) {
        if (month < 10) {
            return numToUpper(month);
        } else if (month == 10) {
            return "十";
        } else {
            return "十" + numToUpper(month - 10);
        }
    }

    private static String dayToUpper(int day) {
        if (day < 20) {
            return monthToUpper(day);
        } else {
            char[] str = String.valueOf(day).toCharArray();
            if (str[1] == '0') {
                return numToUpper(Integer.parseInt(str[0] + "")) + "";
            } else {
                return numToUpper(Integer.parseInt(str[0] + "")) + "十" + numToUpper(Integer.parseInt(str[1] + ""));
            }
        }
    }

    /**
     * 日期转字符串 自定义格式
     *
     * @param date
     * @param format
     * @return
     */
    public static String dateToString(Date date, String format) {
        if (date == null){
            return "";
        }
        // 在Linux服务器下运行时，获取的结果会出现日期中的 " 星期二 " 变成了 " Monday "，这是因为linux的默认语言是英文的。
        // 解决方法：在定义SimpleDateFormat对象时传入时区 Locale.SIMPLIFIED_CHINESE 表示为中文简体
        SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.SIMPLIFIED_CHINESE);
        String str = sdf.format(date);
        return str;
    }

    /**
     * 字符串转日期 yyyy-MM-dd
     *
     * @param str
     * @return
     */
    public static Date stringToDate(String str) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = new Date();
        try {
            date = sdf.parse(str);
        } catch (ParseException e) {
            // e.printStackTrace();
            date = new Date(1);
        }
        return date;
    }

    /**
     * yyyyMMddHHmmss转日期 yyyy-MM-dd HH:mm:ss
     *
     * @param str
     * @return
     */
    public static String stringToDate4(String str) {
        Date date=stringToDate1(str);
        return dateToString(date, YYYY_MM_DD_HH_MM_SS);
    }



    public static Date stringToDate1(String str) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        Date date = new Date();
        try {
            date = sdf.parse(str);
        } catch (ParseException e) {
            // e.printStackTrace();
            date = new Date(1);
        }
        return date;
    }

    /**
     * 字符串转日期 yyyy-MM-dd HH:mm:ss
     *
     * @param str
     * @return
     */
    public static Date stringToDate2(String str) {
        SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
        Date date = new Date();
        try {
            date = sdf.parse(str);
        } catch (ParseException e) {
            // e.printStackTrace();
            date = new Date(1);
        }
        return date;
    }

    public static String getCurrentTime() {
        SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
        return sdf.format(new Date());
    }
    public static String longTimeChangeToStandTime(String longtime) {
        if(StringUtils.isEmpty(longtime)){
            return "";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
        if(StringUtils.isNumeric(longtime)){
            String c = "1";
            for(int i =0 ; i<(13-longtime.length());i++){
                c=c+"0";
            }
            Long datetime = Long.valueOf(longtime)*Long.valueOf(c);
            Date data =  new Date(datetime);
            return sdf.format(data);
        }
        return longtime;
    }

    /**
     * 将时间戳转换为指定的日期
     * @param longtime  时间戳
     * @param datePattern 要转换的日期格式
     * @return
     */
    public static String longTimeChangeToDate(String longtime,String datePattern) {
        if(StringUtils.isEmpty(longtime)){
            return "";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
        if(StringUtils.isNumeric(longtime)){
            String c = "1";
            for(int i =0 ; i<(13-longtime.length());i++){
                c=c+"0";
            }
            Long datetime = Long.valueOf(longtime)*Long.valueOf(c);
            Date data =  new Date(datetime);
            return sdf.format(data);
        }
        return longtime;
    }


    /**
     * 将LocalDate转换为Date
     * @param localDateTime
     * @return
     */
    public static String getLocalDateTimeConvertToDate(LocalDateTime localDateTime){
        String date="";
        if(localDateTime!=null){
            DateTimeFormatter localDateTimeFormat = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS);
            date=localDateTimeFormat.format(localDateTime);
        }
        return date;
    }

    /**
     * 返回LocalDateTime类型
     * @return
     */
    public static LocalDateTime getDateToLocalDateTime(){
        Date date = new Date();
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDateTime localDateTime = date.toInstant().atZone(zoneId).toLocalDateTime();
        return localDateTime;
    }

    /**
     * 返回当前系统时间
     * @return
     */
    public static LocalDateTime getCurrentSystemTime(){
        LocalDateTime time=cn.hutool.core.date.DateUtil.parseLocalDateTime(new DateTime().toString());
        return time;
    }

    /**
     * 获取累加后的时间
     * @param date 日期：2022-10-24 16:24:30
     * @param minute 20
     * @return
     */
    public static String getTotalTime(String date,int minute){
        Date date1=stringToDate2(date);
        DateTime dateTime=cn.hutool.core.date.DateUtil.offsetMinute(date1,minute);
        return dateTime.toString();
    }

    /**
     * 获取累加后的时间
     * @param date 日期：1667214984683 时间戳
     * @param hour 8 累加的小时
     * @return
     */
    public static String getAddHourTime(String date,int hour){
        String time= DateUtil.longTimeChangeToStandTime(date);
        Date date1=stringToDate2(time);
        DateTime dateTime=cn.hutool.core.date.DateUtil.offsetHour(date1,hour);
        return dateTime.toString();
    }

    /**
     * 将日期转换为时间戳
     * @param dateStr 日期
     * @param datePattern 时间格式
     * @return
     */
    public static long dateToTimestamp(String dateStr,String datePattern){
        long timestamp = 0;
        SimpleDateFormat sdf = new SimpleDateFormat(datePattern); //设置日期格式
        try {
            Date date = sdf.parse(dateStr); //将日期字符串转换为Date类型
            timestamp = date.getTime(); //将Date类型转换为时间戳
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return timestamp;
    }

    /**
     * 获取累加后的时间
     * @param date 日期：20221024162430
     * @param minute 20
     * @return
     */
    public static String getTotalTime3(String date,int minute){
        Date date1=stringToDate1(date);
        DateTime dateTime=cn.hutool.core.date.DateUtil.offsetMinute(date1,minute);
        return dateTime.toString();
    }

    /**
     * 获取累加的时间
     * @param timestamp  时间戳：1666601887007
     * @param minute 分钟
     * @return
     */
    public static String getTotalTime2(String timestamp,int minute){
       String date=longTimeChangeToStandTime(timestamp);
       Date date1=stringToDate2(date);
       DateTime dateTime= cn.hutool.core.date.DateUtil.offsetMinute(date1,minute);
       return dateTime.toString();
    }

    /**
     * 日期转换为时间戳
     * @param date 日期
     * @return
     */
    public static long dateToTimestamp(Date date){
        long time=date.getTime();
        return time;
    }

}
